# Copyright 2010-2013 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

from portage.tests import TestCase
from portage.dep import paren_reduce
from portage.exception import InvalidDependString


class TestParenReduce(TestCase):
    def testParenReduce(self):
        test_cases = (
            ("A", ["A"]),
            ("( A )", ["A"]),
            ("|| ( A B )", ["||", ["A", "B"]]),
            ("|| ( A || ( B C ) )", ["||", ["A", "||", ["B", "C"]]]),
            ("|| ( A || ( B C D ) )", ["||", ["A", "||", ["B", "C", "D"]]]),
            (
                "|| ( A || ( B || ( C D ) E ) )",
                ["||", ["A", "||", ["B", "||", ["C", "D"], "E"]]],
            ),
            ("a? ( A )", ["a?", ["A"]]),
            ("( || ( ( ( A ) B ) ) )", ["A", "B"]),
            ("( || ( || ( ( A ) B ) ) )", ["||", ["A", "B"]]),
            ("|| ( A )", ["A"]),
            ("( || ( || ( || ( A ) foo? ( B ) ) ) )", ["||", ["A", "foo?", ["B"]]]),
            (
                "( || ( || ( bar? ( A ) || ( foo? ( B ) ) ) ) )",
                ["||", ["bar?", ["A"], "foo?", ["B"]]],
            ),
            ("A || ( ) foo? ( ) B", ["A", "B"]),
            ("|| ( A ) || ( B )", ["A", "B"]),
            ("foo? ( A ) foo? ( B )", ["foo?", ["A"], "foo?", ["B"]]),
            ("|| ( ( A B ) C )", ["||", [["A", "B"], "C"]]),
            ("|| ( ( A B ) ( C ) )", ["||", [["A", "B"], "C"]]),
            # test USE dep defaults for bug #354003
            (">=dev-lang/php-5.2[pcre(+)]", [">=dev-lang/php-5.2[pcre(+)]"]),
        )

        test_cases_xfail = (
            "( A",
            "A )",
            "||( A B )",
            "|| (A B )",
            "|| ( A B)",
            "|| ( A B",
            "|| A B )",
            "|| A B",
            "|| ( A B ) )",
            "|| || B C",
            "|| ( A B || )",
            "a? A",
            "( || ( || || ( A ) foo? ( B ) ) )",
            "( || ( || bar? ( A ) foo? ( B ) ) )",
        )

        for dep_str, expected_result in test_cases:
            self.assertEqual(
                paren_reduce(dep_str, _deprecation_warn=False),
                expected_result,
                "input: '%s' result: %s != %s"
                % (
                    dep_str,
                    paren_reduce(dep_str, _deprecation_warn=False),
                    expected_result,
                ),
            )

        for dep_str in test_cases_xfail:
            self.assertRaisesMsg(
                dep_str,
                InvalidDependString,
                paren_reduce,
                dep_str,
                _deprecation_warn=False,
            )
